#include <iostream>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>

void daemonize() {
    // 创建子进程
    pid_t pid = fork();
    if (pid < 0) {
        exit(EXIT_FAILURE);
    }
    if (pid > 0) {
        exit(EXIT_SUCCESS);
    }

    // 创建新会话
    if (setsid() < 0) {
        exit(EXIT_FAILURE);
    }

    // 改变当前工作目录
    if (chdir("/") < 0) {
        exit(EXIT_FAILURE);
    }

    // 重设文件权限掩码
    umask(0);

    // 关闭文件描述符
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);

    // 重定向标准 I/O 到 /dev/null
    open("/home/laq/out.txt", O_RDWR);         // stdin
    dup(0);                             // stdout
    dup(0);                             // stderr
}

int main() {
    // 守护进程化
    daemonize();

    // 执行守护进程任务
    while (true) {
        // 这里可以执行守护进程的任务，如监听网络请求、定期执行某项任务等
        std::cout<<"daemon test"<<std::endl;
        sleep(1);
    }

    return 0;
}
